﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;

namespace Demo
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void trvMain_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                lsvMain.Clear();
                lsvMain.LargeImageList = imageList1;

                DirectoryInfo Dir = new DirectoryInfo(e.Node.FullPath);

                DirectoryInfo[] FolderList = Dir.GetDirectories();
                foreach (DirectoryInfo FI in FolderList)
                {
                    ListViewItem listItem = new ListViewItem(FI.Name) { ImageIndex = 1, Tag = FI.FullName };
                    lsvMain.Items.Add(listItem);
                }

                FileInfo[] FileList = Dir.GetFiles();
                foreach (FileInfo FI in FileList)
                {
                    ListViewItem listItem = new ListViewItem(FI.Name) { ImageIndex = 2, Tag = FI.FullName };
                    lsvMain.Items.Add(listItem);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void trvMain_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            try
            {
                if (e.Node.Nodes.Count != 0) e.Node.Nodes.RemoveAt(0); //Xóa nút con "giả"

                string[] dirs = Directory.GetDirectories(e.Node.FullPath); //Lấy danh sách thư mục
                Array.Sort(dirs); //và sắp xếp chúng

                for (int i = 0; i < dirs.Length; i++) //thêm danh sách thư mục vào nút con đó
                {
                    string dirName = dirs[i];
                    TreeNode tn = new TreeNode(Path.GetFileName(dirName));
                    e.Node.Nodes.Add(tn);

                    string[] subdirs = Directory.GetDirectories(dirs[i]); // kiểm tra xem thư mục mới vừa thêm có thư mục con hay không. Nếu có thì thêm một nút con "giả" vào.
                    if (subdirs.Length > 0) tn.Nodes.Add("temp");
                }
            }
            catch { return; }
        }

        private void trvMain_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            txtAddress.Text = e.Node.FullPath;
        }

        private void lsvMain_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            try
            {
                if (e.Item.Text == "") return;

                if (e.IsSelected)
                {
                    lsvMain.Clear();
                    lsvMain.LargeImageList = imageList1;

                    txtAddress.Text = e.Item.Tag + "";
                    DirectoryInfo Dir = new DirectoryInfo(e.Item.Tag + "");

                    DirectoryInfo[] FolderList = Dir.GetDirectories();
                    foreach (DirectoryInfo FI in FolderList)
                    {
                        ListViewItem listItem = new ListViewItem(FI.Name) { ImageIndex = 1, Tag = FI.FullName };
                        lsvMain.Items.Add(listItem);
                    }

                    FileInfo[] FileList = Dir.GetFiles();
                    foreach (FileInfo FI in FileList)
                    {
                        ListViewItem listItem = new ListViewItem(FI.Name) { ImageIndex = 2, Tag = FI.FullName };
                        lsvMain.Items.Add(listItem);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            txtAddress.Text = "Windows Explorer";

            string[] Disk = Directory.GetLogicalDrives(); // Lấy tất cả ổ đĩa và lưu vào mảng Disk
            for (int i = 0; i < Disk.Length; i++)         // Thêm các ổ đĩa vào TreeView đồng thời tạo các nút con "giả" (*) cho nó
            {
                TreeNode tn = new TreeNode(Disk[i]);
                trvMain.Nodes.Add(tn);                    // Ổ đĩa
                tn.Nodes.Add(new TreeNode("*"));
            }
        }
    }
}